package org.example.ymcc.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import org.example.ymcc.constant.Constants;
import org.example.ymcc.constant.RConst;
import org.example.ymcc.domain.dto.ValidImgCodeDto;
import org.example.ymcc.exception.GlobalException;
import org.example.ymcc.result.JsonResult;
import org.example.ymcc.service.ImgCodeService;
import org.example.ymcc.util.AssertUtil;
import org.example.ymcc.util.CodeGenerateUtils;
import org.example.ymcc.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class ImgCodeServiceImpl implements ImgCodeService {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Override
    public String createImgCode(String key) {
        //业务
        AssertUtil.isFalse(StringUtils.isEmpty(key),"图形验证码key不能为空！");
        //2.图形验证码 糊涂工具包
        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha captcha = CaptchaUtil
                .createShearCaptcha(RConst.Num.INTEGER_300, RConst.Num.INT_100, RConst.Num.INT_4, RConst.Num.INT_4);
        String imageCode = captcha.getCode();//验证码

        //保存redis
        redisTemplate.opsForValue().set(key,imageCode,RConst.Num.INT_5, TimeUnit.MINUTES);

        return captcha.getImageBase64();//返回图片验证码
    }

    @Override
    public JsonResult validImgCode(ValidImgCodeDto imgCodeDto) {
        //验证
        String key = imgCodeDto.getKey();
        AssertUtil.isTrue(redisTemplate.hasKey(key),"图片验证码已过期！");
        String imgCode = redisTemplate.opsForValue().get(key).toString();
        //equalsIgnoreCase 不区分大小写
        AssertUtil.isTrue(imgCode.equalsIgnoreCase(imgCodeDto.getCode()),"输入的验证码不正确！");
        //发送短信验证码
        /*
            手机验证码  在1分钟之内 提示操作太快了
                        在3分钟之内 发送同一个验证码
                        超过 重新发送一个验证码
         */
        String newPhoneCode = StrUtils.getRandomString(RConst.Num.INT_6);
        String phoneKey =  Constants.SMS_REGISTER+imgCodeDto.getPhone();
        if(redisTemplate.hasKey(phoneKey)){//判断key是否存在 不在存直接发送新的 存在判断情况
            Long expire = redisTemplate.getExpire(phoneKey);//获取当前key剩余的过期时间 默认是秒110
            AssertUtil.isFalse(expire>RConst.Num.LONG_120,"你太快了");
            String oldPhoneCode = redisTemplate.opsForValue().get(phoneKey).toString();
            System.out.println(oldPhoneCode);
        }else {
            System.out.println(newPhoneCode);//发送短信验证码
        }
        redisTemplate.opsForValue().set(phoneKey,newPhoneCode,
                RConst.Num.INT_3,TimeUnit.MINUTES);
        return JsonResult.success();
    }
}
